package com.wn.login

import android.content.Context
import android.view.View
import androidx.databinding.ObservableField
import androidx.lifecycle.Transformations
import androidx.lifecycle.liveData
import com.blankj.utilcode.util.ToastUtils
import com.wn.common.base.BaseViewModel
import com.wn.login.repository.ILoginRepository
import com.wn.login.repository.data.LoginReq
import com.wn.service.db.UserInfo
import com.wn.service.net.BaseResponse
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

/**
 * @Author: wn
 * @Date: 2023/3/31 16:55
 * @Description: 登陆的 ViewModel
 */
@HiltViewModel
class LoginViewModel @Inject constructor(private val repository: ILoginRepository) :
  BaseViewModel() {
  /**
   * ObservableField只有在数据发生改变时UI才会收到通知，
   * 而LiveData不同，只要你postValue或者setValue，UI都会收到通知，不管数据有无变化
   * livedata还能感知activity的生命周期，在Activity不活动的时候不会触发
   */
  val obMobile = ObservableField("a1234560")// 账号
  val obPassword = ObservableField("123456")// 密码

  /**
   * 手机号是否注册过
   */
  private val liveRegisterRsp = repository.registerRsp

  /**
   * 登陆返回 用户数据
   * liveRegisterRsp 有 值 触发
   */
  val liveLoginRsp = Transformations.switchMap(liveRegisterRsp) {
    liveData {
      if (it.valid) {
        requestLogin()
          ?.onSuccess {
            if (it.code == BaseResponse.SERVER_CODE_SUCCESS || it.code == BaseResponse.SERVER_CODE_SUCCESS1)
              emit(it.result)
          }?.onFailure {
            ToastUtils.showShort("网络异常")
          }
      } else {
        ToastUtils.showShort("该用户不存在")
      }
    }
  }

  /**
   * 检查账号是否注册
   * 登录按钮点击事件--两步
   * 1、判断手机号是否已经注册
   * 2、已经注册的,触发 Transformations.switchMap 去调用登录接口 -- requestLogin
   * 赋值  liveLoginRsp
   */
  fun checkRegister() {
    val account = obMobile.get() ?: return
    apiLaunch {
      repository.checkRegister(account)
    }
  }

  /**
   * 登录请求
   */
  private suspend fun requestLogin(): Result<BaseResponse<UserInfo>>? {
    val account = obMobile.get() ?: return null
    val password = obPassword.get() ?: return null
    return apiLaunchDeferred {
      repository.requestLogin(LoginReq(account, password))
    }
  }

  fun onSuccessLogin(userInfo: UserInfo) {
    apiLaunch {
      repository.insertUser(userInfo)
    }
  }

  fun wechat(ctx: Context) = ToastUtils.showShort("点击了微信登录 ${ctx.packageName}")

  fun qq(v: View) = ToastUtils.showShort("点击了QQ登录 ${v.context.packageName}")

  fun weibo() = ToastUtils.showShort("点击了微博登录")

  fun forget(v: View) = ToastUtils.showShort("静态点击方式 ${v.context.packageName}")

}